package main

import "fmt"

// 结构体是值类型

type person struct {
	name, gender string
}

// go里面函数传参永远是拷贝
func f(x person) {
	x.gender = "女"
}

func f2(x *person) {
	// 根据内存地址修改原变量
	x.gender = "女"
}

func main() {
	var p person
	p.name = "周瑜"
	p.gender = "男"
	f(p)
	fmt.Println(p.gender) // 男

	f2(&p)                // 传入内存地址
	fmt.Println(p.gender) // 女

	// 结构体指针1
	var p2 = new(person)
	fmt.Printf("%T\n", p2) // *main.person
	// 打印p2的16进制
	// p2的值就是一个内存地址
	fmt.Printf("%p\n", p2) // 0xc00004c3e0
	// 打印p2的内存地址
	fmt.Printf("%p\n", &p2) // 0xc000006030

	// 结构体指针2
	// key-value初始化
	var p3 = person{
		name:   "周瑜",
	}
	fmt.Printf("%#v\n", p3) // main.person{name:"周瑜"}

	// 3、 使用值列表形式初始化,值的顺序要和结构体定义时的顺序一致
	p4 := person{
		name:   "周瑜",
		gender: "男",
	}
	fmt.Printf("%#v\n", p4) // main.person{name:"周瑜", gender:"男"}
}
